from machine import Pin import neopixel import time # ---------- Pins ---------- STEP_PIN = 27 DIR_PIN = 26 LED_PIN = 13 BOUTON_PIN = 14 NUM_LEDS = 13 # ---------- Pluie ---------- MM_PAR_CLIC = 5 MAX_MM = 60 VITESSE_MONTEE = 15.0 # mm/s VITESSE_DESCENTE = 3.0 # mm/s ATTENTE_MS = 5000 # ---------- Moteur ---------- TOURS_MAX = 70 # 70 tours = 60 mm PAS_PAR_TOUR = 200 # NEMA 17 sans microstepping SENS = 1 # mets -1 si le curseur tourne a l'envers PAS_MAX_BOUCLE = 80 # pas max par tour de boucle (20 ms) = 4000 pas/s PAS_PAR_MM = TOURS_MAX * PAS_PAR_TOUR / MAX_MM # ---------- Sol ---------- SEUIL_MM = 5.0 COEF = 0.9 PLAGES = [(2, 0, 10), (5, 10, 15), (8, 15, 25), (11, 25, 40), (13, 40, 55)] LUMI = 0.4 COULEUR = (0, 0, 255) def main(): np = neopixel.NeoPixel(Pin(LED_PIN), NUM_LEDS) step = Pin(STEP_PIN, Pin.OUT) direction = Pin(DIR_PIN, Pin.OUT) bouton = Pin(BOUTON_PIN, Pin.IN, Pin.PULL_UP) def humidite(pluie): h = (pluie - SEUIL_MM) * COEF return h if h > 0 else 0.0 def afficher(h): np.fill((0, 0, 0)) for num, lo, hi in PLAGES: f = (h - lo) / (hi - lo) f = 0 if f < 0 else (1 if f > 1 else f) k = f * LUMI np[num - 1] = (int(COULEUR[0] * k), int(COULEUR[1] * k), int(COULEUR[2] * k)) np.write() def avancer(n, sens): direction.value(1 if sens * SENS > 0 else 0) for _ in range(n): step.value(1) time.sleep_us(100) step.value(0) time.sleep_us(100) valeur = 0.0 cible = 0.0 pas_reels = 0 # position du moteur (le curseur doit etre a 0 au demarrage) t_arrive = None dernier_bouton = 1 dernier_t = time.ticks_ms() dernier_print = dernier_t afficher(0) print("Pret. Curseur a 0 mm. Chaque clic = +", MM_PAR_CLIC, "mm") while True: maintenant = time.ticks_ms() dt = time.ticks_diff(maintenant, dernier_t) / 1000.0 dernier_t = maintenant etat = bouton.value() if etat == 0 and dernier_bouton == 1: cible = min(MAX_MM, cible + MM_PAR_CLIC) t_arrive = None print("Clic -> cible =", cible, "mm") time.sleep_ms(50) dernier_bouton = etat if valeur < cible: valeur += VITESSE_MONTEE * dt if valeur >= cible: valeur = cible t_arrive = maintenant elif valeur > 0: if t_arrive is None: t_arrive = maintenant if time.ticks_diff(maintenant, t_arrive) >= ATTENTE_MS: valeur -= VITESSE_DESCENTE * dt if valeur < 0: valeur = 0.0 cible = valeur # Moteur : rejoint la position correspondant a la valeur voulu = int(valeur * PAS_PAR_MM) ecart = voulu - pas_reels if ecart != 0: n = min(abs(ecart), PAS_MAX_BOUCLE) s = 1 if ecart > 0 else -1 avancer(n, s) pas_reels += s * n h = humidite(valeur) afficher(h) if time.ticks_diff(maintenant, dernier_print) >= 500 and (valeur > 0 or cible > 0): dernier_print = maintenant print("Pluie %.1f mm | %.1f tours | sol %.1f %%" % (valeur, pas_reels / PAS_PAR_TOUR, h)) time.sleep_ms(5) main()